Remove useless segments push/pop in VMXAssist.
authorkfraser@localhost.localdomain <kfraser@localhost.localdomain>
Mon, 4 Dec 2006 09:20:12 +0000 (09:20 +0000)
committerkfraser@localhost.localdomain <kfraser@localhost.localdomain>
Mon, 4 Dec 2006 09:20:12 +0000 (09:20 +0000)
According to Intel Spec, segments registors are cleared when exiting
virtual-8086 mode through trap or interrupts gate, so it's no need to
save their values in stack.
Signed-off-by: Xin Li <xin.b.li@intel.com>
tools/firmware/vmxassist/setup.c
tools/firmware/vmxassist/trap.S
tools/firmware/vmxassist/util.c
tools/firmware/vmxassist/vm86.c
tools/firmware/vmxassist/vm86.h

index 4f82ca0d9e4517fda941df44eb1030135cbcdafe..d1c47b23252ffc3679bd789b6e013c359d4ee183 100644 (file)
@@ -66,7 +66,7 @@ struct vmx_assist_context newctx;
 unsigned long memory_size;
 int initialize_real_mode;
 
-extern char stack[], stack_top[];
+extern char stack_top[];
 extern unsigned trap_handlers[];
 
 void
@@ -201,7 +201,7 @@ void
 enter_real_mode(struct regs *regs)
 {
        /* mask off TSS busy bit */
-        gdt[TSS_SELECTOR / sizeof(gdt[0])] &= ~0x0000020000000000ULL;
+       gdt[TSS_SELECTOR / sizeof(gdt[0])] &= ~0x0000020000000000ULL;
 
        /* start 8086 emulation of BIOS */
        if (initialize_real_mode) {
@@ -219,8 +219,10 @@ enter_real_mode(struct regs *regs)
                        regs->cs = booting_vector << 8; /* AP entry point */
                        regs->eip = 0;
                }
-               regs->uesp = 0;
-               regs->uss = 0;
+
+               regs->uesp = regs->uss = 0;
+               regs->eax = regs->ecx = regs->edx = regs->ebx = 0;
+               regs->esp = regs->ebp = regs->esi = regs->edi = 0;
 
                /* intercept accesses to the PIC */
                setiomap(PIC_MASTER+PIC_CMD);
@@ -236,14 +238,12 @@ enter_real_mode(struct regs *regs)
 
                /* this should get us into 16-bit mode */
                return;
-       } else {
-               /* go from protected to real mode */
-               regs->eflags |= EFLAGS_VM;
-
-               set_mode(regs, VM86_PROTECTED_TO_REAL);
-
-               emulate(regs);
        }
+
+       /* go from protected to real mode */
+       regs->eflags |= EFLAGS_VM;
+       set_mode(regs, VM86_PROTECTED_TO_REAL);
+       emulate(regs);
 }
 
 /*
index 30e87adb85665ea1a9466a45c3a3ed8ef0e4efd0..d5ece3e1434049fc7057c9cfdab8f58e3f4993b0 100644 (file)
@@ -100,10 +100,6 @@ trap_handlers:
        .code32
        .align  16
 common_trap:                           /* common trap handler */
-       pushl   %gs
-       pushl   %fs
-       pushl   %ds
-       pushl   %es
        pushal
 
        movl    $(DATA_SELECTOR), %eax  /* make sure these are sane */
@@ -114,17 +110,13 @@ common_trap:                              /* common trap handler */
        movl    %esp, %ebp
 
        pushl   %ebp
-       pushl   52(%ebp)
-       pushl   48(%ebp)
+       pushl   36(%ebp)
+       pushl   32(%ebp)
        call    trap                    /* trap(trapno, errno, regs) */
        addl    $12, %esp
 
 trap_return:
        popal
-       popl    %es
-       popl    %ds
-       popl    %fs
-       popl    %gs
        addl    $8, %esp                /* skip trapno, errno */
        iret
        /* NOT REACHED */
@@ -152,10 +144,6 @@ switch_to_real_mode:
        pushl   oldctx+VMX_ASSIST_CTX_EIP
        pushl   $-1                     /* trapno, errno */
        pushl   $-1
-       pushl   %gs
-       pushl   %fs
-       pushl   %ds
-       pushl   %es
        pushal
 
        movl    %esp, %ebp
index 6ae4b25f79f8ac9430bad0764028d10be7b59dad..2c4c016989355fe2113434b58aacd5b7247e96bf 100644 (file)
@@ -62,17 +62,15 @@ dump_regs(struct regs *regs)
                regs->eax, regs->ecx, regs->edx, regs->ebx);
        printf("esp    %8x ebp    %8x esi    %8x edi    %8x\n",
                regs->esp, regs->ebp, regs->esi, regs->edi);
-       printf("es     %8x ds     %8x fs     %8x gs     %8x\n",
-               regs->es, regs->ds, regs->fs, regs->gs);
        printf("trapno %8x errno  %8x\n", regs->trapno, regs->errno);
        printf("eip    %8x cs     %8x eflags %8x\n",
                regs->eip, regs->cs, regs->eflags);
-       printf("uesp   %8x uss    %8x \n",
+       printf("uesp   %8x uss    %8x\n",
                regs->uesp, regs->uss);
        printf("ves    %8x vds    %8x vfs    %8x vgs    %8x\n",
                regs->ves, regs->vds, regs->vfs, regs->vgs);
 
-       printf("cr0    %8lx cr2    %8x cr3    %8lx cr4    %8lx\n",
+       printf("cr0    %8lx cr2    %8x cr3    %8lx cr4    %8lx\n\n",
                (long)oldctx.cr0, get_cr2(),
                (long)oldctx.cr3, (long)oldctx.cr4);
 }
index 5bae53ed6d89fbfdc4912a35824dbaa23dbcd6c6..7e37de63b8fcccadb3384e582723adb2309f4cc9 100644 (file)
@@ -376,9 +376,9 @@ segment(unsigned prefix, struct regs *regs, unsigned seg)
        if (prefix & SEG_SS)
                seg = regs->uss;
        if (prefix & SEG_FS)
-               seg = regs->fs;
+               seg = regs->vfs;
        if (prefix & SEG_GS)
-               seg = regs->gs;
+               seg = regs->vgs;
        return seg;
 }
 
@@ -934,6 +934,8 @@ load_or_clear_seg(unsigned long sel, uint32_t *base, uint32_t *limit, union vmcs
 static void
 protected_mode(struct regs *regs)
 {
+       extern char stack_top[];
+
        regs->eflags &= ~(EFLAGS_TF|EFLAGS_VM);
 
        oldctx.eip = regs->eip;
@@ -958,12 +960,10 @@ protected_mode(struct regs *regs)
                          &oldctx.gs_limit, &oldctx.gs_arbytes);
 
        /* initialize jump environment to warp back to protected mode */
+       regs->uss = DATA_SELECTOR;
+       regs->uesp = stack_top;
        regs->cs = CODE_SELECTOR;
-       regs->ds = DATA_SELECTOR;
-       regs->es = DATA_SELECTOR;
-       regs->fs = DATA_SELECTOR;
-       regs->gs = DATA_SELECTOR;
-       regs->eip = (unsigned) &switch_to_protected_mode;
+       regs->eip = (unsigned) switch_to_protected_mode;
 
        /* this should get us into 32-bit mode */
 }
@@ -975,10 +975,6 @@ static void
 real_mode(struct regs *regs)
 {
        regs->eflags |= EFLAGS_VM | 0x02;
-       regs->ds = DATA_SELECTOR;
-       regs->es = DATA_SELECTOR;
-       regs->fs = DATA_SELECTOR;
-       regs->gs = DATA_SELECTOR;
 
        /*
         * When we transition from protected to real-mode and we
@@ -1070,9 +1066,6 @@ set_mode(struct regs *regs, enum vm86_mode newmode)
        case VM86_PROTECTED:
                if (mode == VM86_REAL_TO_PROTECTED) {
                        protected_mode(regs);
-//                     printf("<VM86_PROTECTED>\n");
-                       mode = newmode;
-                       return;
                } else
                        panic("unexpected protected mode transition");
                break;
index 4c6609daf0aed2dd6b84a6a378c6292b7aa15dc7..ea8c2728d38f8fdf977e6970a8a78e39d58426f0 100644 (file)
@@ -34,7 +34,6 @@
 
 struct regs {
        unsigned        edi, esi, ebp, esp, ebx, edx, ecx, eax;
-       unsigned        es, ds, fs, gs;
        unsigned        trapno, errno;
        unsigned        eip, cs, eflags, uesp, uss;
        unsigned        ves, vds, vfs, vgs;
@@ -55,7 +54,6 @@ enum vm86_mode {
 
 extern enum vm86_mode prevmode, mode;
 extern struct vmx_assist_context oldctx;
-extern struct vmx_assist_context newctx;
 
 extern void emulate(struct regs *);
 extern void dump_regs(struct regs *);